package com.htgd.gardenexpo.utils;

import static com.htgd.gardenexpo.utils.TimeUtils.formatSecondsToTime;

/**
 * 运算工具类
 */
public class CalculationUtils {

    // 地球半径，单位为公里
    private static final double EARTH_RADIUS = 6371.0;

    //两数相减返回正负几
    public static String subtractAndFormat(long a, long b) {
        long result = a - b;
        // 根据结果的符号返回格式化的字符串
        if (result > 0) {
            return "+" + result;
        } else if (result < 0) {
            return String.valueOf(result);  // 负数不需要加 "+" 前缀
        } else {
            return "0";  // 结果为0时返回 "0"
        }
    }

    /**
     * 获取配速
     * @param
     * @param distanceInKilometers
     * @return
     */
    public static String getSpeed(long durationInSeconds, double distanceInKilometers) {
        // 检查输入是否有效
        if (durationInSeconds <= 0 || distanceInKilometers <= 0) {
            return "0'00''"; // 输入无效时返回提示
        }

        // 计算配速的总分钟数
        double totalMinutes = durationInSeconds / 60.0;  // 总分钟数（使用 double 类型来确保更精确的计算）

        // 计算每公里的分钟数和秒数
        double minutesPerKilometer = totalMinutes / distanceInKilometers;
        int minutes = (int) minutesPerKilometer; // 获取分钟数
        int seconds = (int) Math.round((minutesPerKilometer - minutes) * 60); // 获取秒数并四舍五入

        // 格式化输出，确保秒数是两位
        return String.format("%d'%02d''", minutes, seconds);

    }

    /**
     * 百分比
     * @param numerator
     * @param denominator
     * @return
     */
    public static String getPercentage(String numerator, String denominator) {
        // 检查分母是否为零
        if ("0".equals(denominator)) {
            return "除数不能为零";
        }

        // 使用double类型进行运算
        double seconds = Double.parseDouble(numerator); // 秒数
        double minutes = Double.parseDouble(denominator); // 分钟数

        // 计算分钟数对应的秒数
        double totalSecondsInMinute = minutes * 60;

        // 计算百分比
        double result = (seconds / totalSecondsInMinute) * 100;

        // 使用String.format来保留两位小数
        return String.format("%.2f", result);
    }

    public static String getPercentage2(String numerator, String denominator) {
        // 检查分母是否为零
        if ("0".equals(denominator)) {
            return "除数不能为零";
        }

        // 使用double类型进行运算
        double kilometers = Double.parseDouble(numerator); // 行驶的公里数
        double totalKilometers = Double.parseDouble(denominator); // 总公里数

        // 计算百分比
        double result = (kilometers / totalKilometers) * 100;

        // 使用String.format来保留两位小数
        return String.format("%.2f", result);
    }

    public static String getSubtraction(String numerator, String denominator) {
        double v1 = Double.parseDouble(numerator);
        double v2 = Double.parseDouble(denominator);
        // 检查除数是否为零
        if (v1>v2) {
            return "0";
        }

        // 使用double类型进行除法运算
        double result = v2-v1;

        // 使用String.format来保留两位小数
        return String.format("%.2f", result);
    }

    public static String getSubtraction2(String numerator, String denominator) {
        double seconds = Double.parseDouble(numerator);  // 秒数
        double minutes = Double.parseDouble(denominator);  // 分钟数

        // 将分钟转换为秒
        double totalSecondsInMinutes = minutes * 60;

        // 检查秒数是否大于分钟所对应的秒数
        if (seconds > totalSecondsInMinutes) {
            return "0";  // 如果秒数大于对应的秒数，返回 "0"
        }

        // 计算秒数差
        double result = totalSecondsInMinutes - seconds;

        // 使用String.format来保留两位小数
        return formatSecondsToTime((long) result);
    }

    // 计算两个经纬度之间的距离
    public static double calculateDistance(String lat1, String lon1, String lat2, String lon2) {

        // 将角度转换为弧度
        // 将角度转换为弧度
        double lat1Rad = Math.toRadians(Double.parseDouble(lat1));
        double lon1Rad = Math.toRadians(Double.parseDouble(lon1));
        double lat2Rad = Math.toRadians(Double.parseDouble(lat2));
        double lon2Rad = Math.toRadians(Double.parseDouble(lon2));

        // 经度和纬度的差值
        double latDiff = lat2Rad - lat1Rad;  // 纬度差
        double lonDiff = lon2Rad - lon1Rad; // 经度差

        // Haversine 公式
        double a = Math.sin(latDiff / 2) * Math.sin(latDiff / 2)
                + Math.cos(lat1Rad) * Math.cos(lat2Rad)
                * Math.sin(lonDiff / 2) * Math.sin(lonDiff / 2);
        double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));

        // 计算距离
        return EARTH_RADIUS * c;

    }

//    public static void main(String[] args) {
//        // 示例：北京和上海的经纬度
//        double lat1 = 39.9042; // 北京纬度
//        double lon1 = 116.4074; // 北京经度
//        double lat2 = 31.2304; // 上海纬度
//        double lon2 = 121.4737; // 上海经度
//
//        // 计算并输出距离
//        Double distance = calculateDistance(lat1, lon1, lat2, lon2);
//        // 输出结果，保留小数点后两位
//        System.out.println(distance);
//    }
}
